package com.doublefish.doublefishrobot.utils.socket;

import com.doublefish.doublefishrobot.ui.home.bean.ModeSettingBean;
import com.doublefish.doublefishrobot.utils.ble.bean.CRCUtils;

import java.util.List;

/**
 * 作者:dugaofeng on 2024/12/30 14:20
 */
public class DFS5ProtocolMaker {

//    // FIXME: 2025/2/11  不需要 connect 和 close
//    //发送连接指令 (用于告知发球机 已连接)
//    public static char[] connect() {
//        char[] data = new char[11];
//        //帧头
//        data[0] = 'D';
//        data[1] = 'F';
//        data[2] = 'S';
//        data[3] = '5';
//
//        data[4] = 'C';
//        data[5] = 'O';
//        data[6] = 'N';
//        data[7] = 'N';
//        data[8] = 'E';
//        data[9] = 'C';
//        data[10] = 'T';
//        return data;
//    }
//
//
//    //发送关闭指令 (用于告知发球机 需要断开)
//    public static char[] close() {
//        char[] data = new char[10];
//        //帧头
//        data[0] = 'D';
//        data[1] = 'F';
//        data[2] = 'S';
//        data[3] = '5';
//
//        data[4] = 'C';
//        data[5] = 'L';
//        data[6] = 'O';
//        data[7] = 'S';
//        data[8] = 'E';
//        data[9] = 'D';
//        return data;
//    }


    //心跳包 用于维持socket的连接
    public static char[] heartBeat() {
        char[] data = new char[7];
        //帧头
        data[0] = 'T';
        data[1] = 'C';
        data[2] = 'P';

        data[3] = 'L';
        data[4] = 'I';
        data[5] = 'N';
        data[6] = 'K';
        return data;
    }


    /// 开始发球
    ///   - mode: 发球模式  0基本模式  1-7内置模式  9随机模式  20
    ///   - stepBeans: 每步的参数
    public static char[] start(int mode, List<ModeSettingBean.ModeSettingStepBean> stepBeans) {
        if (stepBeans == null || stepBeans.size() == 0) {
            return null;
        }

        char[] data = new char[64];
        for (int i = 0; i < 64; i++) {
            data[i] = '0';
        }

        //帧头
        data[0] = 'D';
        data[1] = 'F';
        data[2] = 'S';
        data[3] = '5';

        //所有的数字都转化为字符  + '0'
        data[4] = '1';  //0:停止 1:启动
        data[5] = (char) ('0'+ mode);  //0:基本模式  1-7内置模式  9随机模式  20 自定义模式
        data[6] = (char) ('0' + stepBeans.size());  //总步数  默认1步

        int index = 7;
        for (int i = 0; i < stepBeans.stream().count(); i++) {
            ModeSettingBean.ModeSettingStepBean step = stepBeans.get(i);

            int spinType = 0;
            int spin = 0;
            if (step.getRotationType() == 1) {
                spinType = 1;
                spin = step.getUpRotationItemBean().getCurrentValue();
            } else if (step.getRotationType() == 2) {
                spinType = 2 ;
                spin = step.getDownRotationItemBean().getCurrentValue();
            }
            data[index] = (char) (spinType + '0');
            index++;
            data[index] =  (char)(spin + '0');
            index++;
            data[index] =  (char)(step.getSpeedItemBean().getCurrentValue() + '0');
            index++;
            data[index] =  (char)(step.getFrequencyItemBean().getCurrentValue() + '0');
            index++;
            data[index] =  (char)(step.getHorizontalItemBean().getCurrentValue() + '0');
            index++;
        }

        //计算 校验位
        int check = CRCUtils.calcCrc16(data, 62);
        data[62] = (char)(check >> 8);
        data[63] = (char)(check & 0x00FF);  //按位与 取第二个字节;

        return data;
    }


    //停止发球
    public static char[] stop() {
        char[] data = new char[64];
        for (int i = 0; i < 64; i++) {
            data[i] = '0';
        }
        //帧头
        data[0] = 'D';
        data[1] = 'F';
        data[2] = 'S';
        data[3] = '5';

        //所有的数字都转化为字符  + '0'
        data[4] = '0';  //0:停止 1:启动
        data[5] = '0';  //0:基本模式
        data[6] = '0' + 1;  //总步数  默认1步
        data[7] = '0';  //默认不旋
        data[8] = '0';
        data[9] = '0' + 3;  //默认速度3
        data[10] = '0' + 4;  //默认频率4
        data[11] = '0' + 6;  //默认落点6

        //计算 校验位
        int check = CRCUtils.calcCrc16(data, 62);
        data[62] = (char) (check >> 8);
        data[63] = (char) (check & 0x00FF);  //按位与 取第二个字节;
        return data;
    }

    public static char[] startRandomMode(int index) {

        char[] data = new char[64];
        for (int i = 0; i < 64; i++) {
            data[i] = '0';
        }
        //帧头
        data[0] = 'D';
        data[1] = 'F';
        data[2] = 'S';
        data[3] = '5';

        //所有的数字都转化为字符  + '0'
        data[4] = '1';  //0:停止 1:启动
        data[5] = '9';  //9:随机模式
        data[6] = '0' + 1;  //总步数  默认1步

        data[9] = (char)('0' + index) ;  //速度 这里用来表示是那个随机模式

        //计算 校验位
        int check = CRCUtils.calcCrc16(data, 62);
        data[62] = (char) (check >> 8);
        data[63] = (char) (check & 0x00FF);  //按位与 取第二个字节;
        return data;
    }

    //卸球
    public static char[] unload() {
        // UNLOAD
        char[] data = new char[6];
        //帧头
        data[0] = 'U';
        data[1] = 'N';
        data[2] = 'L';
        data[3] = 'O';
        data[4] = 'A';
        data[5] = 'D';
        return data;
    }

    //停止卸球
    public static char[] stopUnload() {
        //停止卸球 使用和停止发球同样扥指令
        return stop();
    }

    //遥控器解绑
    public static char[] unbindRemote() {
        // UNLOAD
        char[] data = new char[6];
        //帧头
        data[0] = 'U';
        data[1] = 'N';
        data[2] = 'B';
        data[3] = 'I';
        data[4] = 'N';
        data[5] = 'D';
        return data;
    }

}
